#ifndef __DO_TEST_H__
#define __DO_TEST_H__
#include <stdint.h>
#include <limits.h>
#include "thread_ctrl.h"

#define DO_ITEM_NAME            "DO"
#define DO_ITEM_NUM             (1 + 2)
#define DO_ARGV_OFFSET          2
#define DO_DRV_NAME             "pcie_do"
#define DO_MAX_NUM              32

enum do_mode {
    DO_MOD_LEVEL        = 0,                /* 电平输出 */
    DO_MOD_PULSE        = 1,                /* 脉冲输出 */
};

enum do_timeout_t {
    DO_TIMEOUT_OFF  = 0,                    /* 关闭吸合超时 */
    DO_TIMEOUT_ON   = 1,                    /* 打开吸合超时 */
};

struct pulse_t {
    uint16_t high;                          /* 脉冲高电平时间, ms */
    uint16_t cycle;                         /* 脉冲周期, ms */
    uint32_t num;                           /* 脉冲个数 */
};

/* DO 设备 */
struct do_dev_t {
    void *parent;                           /* 父指针 */
    char name[32];                          /* 设备名 */
    uint8_t index;                          /* 索引号 */

    uint8_t mode;                           /* 模式 */
    uint8_t timeout_sta;                    /* 吸合超时状态 */
    uint8_t timeout_sec;                    /* 吸合超时时间, s */
    uint8_t set_val;                        /* 配置电平 */
    uint8_t get_val;                        /* 获取电平 */
    uint16_t pulse_high;                    /* 脉冲高电平时间, ms */
    uint16_t pulse_cycle;                   /* 脉冲周期时间, ms */
    uint32_t pulse_num;                     /* 脉冲数量 */
    uint8_t pulse_sta;                      /* 脉冲状态, 0: 开始; 1: 停止 */

    char path[PATH_MAX];                    /* 路径 */
    int fd;                                 /* 文件 */
    struct thread_param_t *write_thread;    /* 发送线程 */
};

/* DO 信息 */
struct do_param_t {
    void *parent;                           /* 父指针 */
    char name[32];                          /* 设备名 */
    uint8_t dev_id;                         /* 设备索引号 */
    uint8_t dev_num;                        /* 设备数量 */
    uint8_t max_num;                        /* 最大数量 */
    uint8_t type;                           /* 模块类型 */

    struct do_dev_t *dev;                   /* DO 设备 */
    uint32_t set_val;                       /* 配置电平 */
    uint32_t get_val;                       /* 回读电平 */

    uint8_t item_id;                        /* 测试项目号 */
    uint8_t en_write;                       /* 使能发送 */
    int write_cnt;                          /* 发送数量 */
};

struct do_item_t {
    struct thread_info_t *thread;
    struct do_param_t *param;
};

int do_test(int argc, char *argv[]);

#endif /* __DO_TEST_H__ */
